﻿Imports Castle.ActiveRecord
Imports NHibernate
Imports NHibernate.Criterion

Namespace Model
    ''' <summary>
    ''' Retorna o estoque agrupado por produto para tela de pesquisa
    ''' </summary>
    ''' <remarks>Ainda não fiz o join com produto no método ListaEstoque</remarks>
    <Serializable(), ActiveRecord("estoque", DynamicUpdate:=False)> _
    Public Class EstoquePesquisa
        Inherits ActiveRecordBase(Of Model.EstoquePesquisa)

        Private _cd_estoque As Integer
        Private _cd_produto As Integer
        Private _quantidade As Decimal
        Private _reservado As Decimal

        'Private _Produto As Model.Produto

        <PrimaryKey(PrimaryKeyType.Sequence, SequenceName:="estoque_cd_estoque_seq")>
        Public Property cd_estoque As Integer
            Get
                Return _cd_estoque
            End Get
            Set(ByVal value As Integer)
                _cd_estoque = value
            End Set
        End Property

        <[Property]("cd_produto")> _
        Public Property cd_produto As Integer
            Get
                Return _cd_produto
            End Get
            Set(ByVal value As Integer)
                _cd_produto = value
            End Set
        End Property

        <[Property]("quantidade")> _
        Public Property quantidade As Decimal
            Get
                Return _quantidade
            End Get
            Set(ByVal value As Decimal)
                _quantidade = value
            End Set
        End Property

        <[Property]("reservado")> _
        Public Property reservado As Decimal
            Get
                Return _reservado
            End Get
            Set(ByVal value As Decimal)
                _reservado = value
            End Set
        End Property

        '<BelongsTo("cd_produto")> _
        'Public Property Produto As Model.Produto
        '    Get
        '        Return _Produto
        '    End Get
        '    Set(ByVal value As Model.Produto)
        '        _Produto = value
        '    End Set
        'End Property

        Public Function ListaEstoque() As IList(Of Model.EstoquePesquisa)

            'Dim hql As Hql = hql


            ' Cria um filtro independente
            Dim Query As DetachedCriteria = DetachedCriteria.For(Of Model.EstoquePesquisa)("estoque")

            ' Seta os parâmetros do filtro
            Query.SetProjection(Projections.ProjectionList() _
                                .Add(Projections.Max("cd_estoque"), "cd_estoque") _
                                .Add(Projections.GroupProperty("cd_produto"), "cd_produto") _
                                .Add(Projections.Sum("quantidade"), "quantidade") _
                                .Add(Projections.Sum("reservado"), "reservado") _
                                )

            
            ' C#: SimpleQuery<Post> q = new SimpleQuery<Post>(@"from Post p where p.Blog.Author = ?", author);
            ' By http://docs.castleproject.org/Active%20Record.Using%20HQL%20(Hibernate%20Query%20language).ashx
            Dim q As SimpleExpression
            q = New SimpleExpression("from estoque e ", "", "")

            ' Ref: http://www.billsternberger.net/nhibernate/nhibernate-icriterion-query-wc/


            ' Passa o filtro para o método de listagem
            Return Model.EstoquePesquisa.FindAll(Query)

        End Function
    End Class
End Namespace